//
// Created by yewa on 2021/11/16.
//

#include <DrawBackground.h>
#include <GLUtil.h>

void DrawBackground::draw() {
    if (m_ProgramObj == 0)
        return;
    glClear(GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(0.5, 0.5, 1.0, 1.0);


    // 通过id通知GPU 我们要使用这个着色器程序了
    glUseProgram(m_ProgramObj);

    GLfloat vVertices[] = {0.0f, 0.5f,
                           -0.5f, -0.5f,
                           0.5f, -0.5f
    };

    //加载顶点数组到顶点着色器中的 0 号变量中去
    //参数说明：第一个参数为着色器中的location变量值 也就是第几号变量，不再需要使用着色器中变量名创建int的id了
    //第二个参数表示 当前这个数组步长  也就是说里面的一组数据是多长，我们这里只指定了xy坐标，所以一组数据是2，如果指定z坐标那么一组就是3，最多4个 最后一个不记得叫啥来着了，反正是用于3D到2D映射用的 一般都是固定为1
    //倒数第二个参数0 表示偏移量，也就是说一组数据与一组数据之间的间隔大小
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, vVertices);
    //启用0号位置变量的配置
    glEnableVertexAttribArray(0);
    //绘制缓冲数组，第一个参数为绘制类型 - 三角形    第二个参数为缓冲区数据的偏移量，第三个参数为总共有多少个三角形顶点
    glDrawArrays(GL_TRIANGLES, 0, 3);

}

void DrawBackground::init() {
    if (m_ProgramObj != 0) return;

    if (m_ProgramObj != 0)
        return;
    char vShaderStr[] =
            "#version 300 es                          \n"
            "layout(location = 0) in vec4 vPosition;  \n"
            "void main()                              \n"
            "{                                        \n"
            "   gl_Position = vPosition;              \n"
            "gl_PointSize = 50.0; \n"
            "}                                        \n";

    char fShaderStr[] =
            "#version 300 es                              \n"
            "precision mediump float;                     \n"
            "out vec4 fragColor;                          \n"
            "void main()                                  \n"
            "{                                            \n"
            "   fragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 );  \n"
            "}                                            \n";

    m_ProgramObj = GLUtil::CreateProgram(vShaderStr, fShaderStr, m_VertexShader, m_FragmentShader);

}

void DrawBackground::onSurfaceChanged(int width, int height) {
    DrawBackground::width = width;
    this->height = height;
    glViewport(0, 0, width, height);
}